package com.yang.service;

import com.yang.service.addFileToPhone.GetPCDirInFileUrl;
import com.yang.service.addFileToPhone.GetPhoneFileManages;
import com.yang.util.AdbConnect;

import java.io.File;
import java.util.Scanner;

/**
 * 实现了添加文件到手机的程序逻辑实现，
 * 主要负责复制文件或文件夹的大概流程的逻辑实现
 */
public class AddFileToPhone {

    /**
     * 命令语句
     */
    private String cmd = "";
    private Scanner sc = new Scanner(System.in);

    /**
     * 负责复制文件或文件夹到子功能的启动
     *
     * @param url 电脑上需要复制的文件夹或文件的路径
     */
    public void run(String url) {
        /*所给的路径是文件夹还是文件*/
        File file = new File(url);
        if (file.isFile()) {//如果是文件
            addFile(url);
        } else if (file.isDirectory()) {//如果是文件夹
            addFileList(url);
        }
        sc.close();
    }

    /**
     * 如果所给的路径是一个文件夹，
     * 需要迭代读取文件夹里的文件内容，
     * 去手机里找到匹配的文件夹，
     * 循环调用添加文件的方法
     *
     * @param url 文件夹的路径
     */
    private void addFileList(String url) {
        /*尝试寻找手机内是否存在同名的文件*/
        GetPCDirInFileUrl getPCDirInFileUrl = new GetPCDirInFileUrl();
        for (String fileUrl : getPCDirInFileUrl.getFileUrls(url)) {//循环读取电脑的上的文件夹的文件路径
            addFile(fileUrl);
        }

    }

    /**
     * 添加文件到手机
     *
     * @param url 与要添加的文件的电脑绝对路径
     */
    private void addFile(String url) {
        File file = new File(url);//获取电脑的文件信息
        /*根据电脑的文件名搜索手机中存在的相同文件路径信息*/
        GetPhoneFileManages getPhoneFileManages = new GetPhoneFileManages();
        String phoneFileUrl = getPhoneFileManages.getFileUrl(file.getName());
        if ("".equals(phoneFileUrl)) {//如果文件不存在
            phoneNotExistFile(url, getPhoneFileManages, file);
        } else {
            phoneExistFile(url, getPhoneFileManages, phoneFileUrl);
        }
    }

    /**
     * 如果手机内不存在同名文件调用此方法
     *
     * @param url                 需要复制的文件到手机的绝对路径
     * @param getPhoneFileManages 获取手机的文件的权限信息对象
     * @param file                获取需要复制的电脑文件信息
     */
    public void phoneNotExistFile(String url, GetPhoneFileManages getPhoneFileManages, File file) {
        System.out.println("请输入添加到手机的路径：");
        String phoneDirUrl = sc.next();
        String fileUrlNsUrl = getPhoneFileManages.getFileUrlNsUrl(phoneDirUrl + "/*.*").split("\n")[0];
        String phoneFilePower = getPhoneFileManages.getPower(fileUrlNsUrl);
        String phoneFileUser = getPhoneFileManages.getUser(fileUrlNsUrl);
        String phoneFileUrl = phoneDirUrl + "/" + file.getName();
        System.out.println("分析结果：\n"
                + "手机内路径：" + phoneFileUrl
                + "\n权限信息：" + phoneFilePower
                + "\n所属：" + phoneFileUser
                + "\n输入y确认：");
        if (!"y".equals(sc.next())) {
            System.out.println("请输入权限（参考644）：");
            phoneFilePower = sc.next();
            System.out.println("请输入所属（参考root:root）：");
            phoneFileUser = sc.next();
        }
        cmd = "adb push " + url + " " + phoneFileUrl;
        AdbConnect.run(cmd);
        cmd = "adb shell chmod " + phoneFilePower + " " + phoneFileUrl;
        AdbConnect.run(cmd);
        cmd = "adb shell chown " + phoneFileUser + " " + phoneFileUrl;
        AdbConnect.run(cmd);
    }

    /**
     * 如果手机内存在同名文件调用此方法
     *
     * @param url                 需要复制的文件到手机的绝对路径
     * @param getPhoneFileManages 获取手机的文件的权限信息对象
     * @param phoneFileUrl        手机内的同名文件所在路径字符串集合
     */
    public void phoneExistFile(String url, GetPhoneFileManages getPhoneFileManages, String phoneFileUrl) {
        String phoneFilePower = getPhoneFileManages.getPower(phoneFileUrl);
        String phoneFileUser = getPhoneFileManages.getUser(phoneFileUrl);
        System.out.println("分析结果：\n"
                + "手机内路径：" + phoneFileUrl
                + "\n权限信息：" + phoneFilePower
                + "\n所属：" + phoneFileUser
                + "\n输入y确认：");
        if ("y".equals(sc.next())) {
            cmd = "adb push " + url + " " + phoneFileUrl;
            AdbConnect.run(cmd);
            cmd = "adb shell chmod " + phoneFilePower + " " + phoneFileUrl;
            AdbConnect.run(cmd);
            cmd = "adb shell chown " + phoneFileUser + " " + phoneFileUrl;
            AdbConnect.run(cmd);
        }
    }

}
